﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dominio;

namespace Interfaces
{
    public class ImpIReporte : IReporte
    {
        public DataTable ListadoDeCargas(DateTime fechaDesde,DateTime fechaHasta, int capacidad, Surtidor idSurtidor)
        {
            ITanque tanques = new ImpITanque();
            List<Expendido> datosExpendido = new List<Expendido>();
           
            //agrego todos los datos a la lista que voy a mostrar
            foreach (Manguera m in idSurtidor.GetTodasMangueras()) {
                List<Expendido> listExpendido = m.Expendidos;
                foreach (Expendido e in listExpendido) {
					datosExpendido.Add(e);
                }
            }

            //Creo la tabla
            DataTable Tabla = new DataTable();
            //Agrego las columnas
            DataColumn columnCero = new DataColumn();
            columnCero.DataType = Type.GetType("System.Int32");
            columnCero.ColumnName = "IdExpendido";
            Tabla.Columns.Add(columnCero);

            DataColumn columnUno = new DataColumn();
            columnUno.DataType = Type.GetType("System.DateTime");
            columnUno.ColumnName = "Fecha";
            Tabla.Columns.Add(columnUno);

            DataColumn columnDos = new DataColumn();
            columnDos.DataType = Type.GetType("System.String");
            columnDos.ColumnName = "Litros";
            Tabla.Columns.Add(columnDos);

            DataColumn columnTres = new DataColumn();
            columnTres.DataType = Type.GetType("System.Int32");
            columnTres.ColumnName = "Surtidor";
            Tabla.Columns.Add(columnTres);

            //filtro por fecha
            foreach (Expendido exp in datosExpendido) {
                if (exp.FechaHora >= fechaDesde && exp.FechaHora <= fechaHasta && exp.CantidadLitros >= capacidad)
                {
                    DataRow fila = Tabla.NewRow();
                    fila["IdExpendido"] = exp.IdExpendido;
                    fila["Fecha"] = exp.FechaHora;
                    fila["Litros"] = exp.CantidadLitros.ToString();
                    fila["Surtidor"] = idSurtidor.IdSurtidor;
                    Tabla.Rows.Add(fila);
                }
            }
            return Tabla;
        }

        public List<String> DetalleCarga(Expendido idExpendido, Surtidor idSurtidor) {

            ITanque tanques = new ImpITanque();
            List<String> resultado = new List<String>();

            foreach (Manguera m in idSurtidor.GetTodasMangueras())
            {
                List<Expendido> listExpendido = m.Expendidos;
                foreach (Expendido expendido in listExpendido)
                {
                    if (expendido.IdExpendido == idExpendido.IdExpendido)
                    {
                        resultado.Add(expendido.FechaHora.ToString());
                        resultado.Add(expendido.Cliente.GetNombre());
                        resultado.Add(expendido.CantidadLitros.ToString());
                        resultado.Add(m.IdManguera.ToString());
                        //resultado.Add(m.Tanque.Contenido.Nombre);
                        return resultado;
                    }
                }
            }   
            return resultado;
            
        }

        public DataTable HistoricoMantenimiento(Surtidor idSurtidor, DateTime fechaDesde, DateTime fechaHasta){

            ITanque it = new ImpITanque();
            List<Tanque> listaTanques = new List<Tanque>();

            //busco todos los tanques conectados
            foreach (Manguera m in idSurtidor.GetTodasMangueras())
            {
                Tanque tan = m.Tanque;
                if (!listaTanques.Contains(tan)){
                    listaTanques.Add(m.Tanque);
                }
            }

            //Creo la tabla
            DataTable Tabla = new DataTable();
            //Agrego las columnas
            DataColumn columnCeroUno = new DataColumn();
            columnCeroUno.DataType = Type.GetType("System.Int32");
            columnCeroUno.ColumnName = "ID";
            Tabla.Columns.Add(columnCeroUno);

            DataColumn columnUno = new DataColumn();
            columnUno.DataType = Type.GetType("System.DateTime");
            columnUno.ColumnName = "Fecha";
            Tabla.Columns.Add(columnUno);

            DataColumn columnDos = new DataColumn();
            columnDos.DataType = Type.GetType("System.String");
            columnDos.ColumnName = "Tarea";
            Tabla.Columns.Add(columnDos);

            
            DataColumn columnTres = new DataColumn();
            columnTres.DataType = Type.GetType("System.Int32");
            columnTres.ColumnName = "Litros";
            Tabla.Columns.Add(columnTres);
            

            //recorro los tanques
            foreach (Tanque t in listaTanques) 
            {
                int idTanque = t.idTanque;
                //String contenidoTanque = t.Contenido.Nombre;
                foreach (TareaMantenimiento r in t.Mantenimientos) 
                {
                    if (r.FechaHora >= fechaDesde && r.FechaHora <= fechaHasta) 
                    {
                        DataRow fila = Tabla.NewRow();
                        fila["ID"] = t.idTanque;
                        fila["Fecha"] = r.FechaHora;
                        fila["Tarea"] = r.GetType().Name;
                        if (r is Reposicion)
                            fila["Litros"] = (r as Reposicion).Litros;
                        else
                            fila["Litros"] = 0;
                        Tabla.Rows.Add(fila);
                    }                    
                }            
            }
            return Tabla;
        }

        public DataTable InfoTanque()
        {
            //Creo la tabla
            DataTable Tabla = new DataTable();
            
            //Agrego las columnas
            DataColumn columnCeroUno = new DataColumn();
            columnCeroUno.DataType = Type.GetType("System.Int32");
            columnCeroUno.ColumnName = "ID";
            Tabla.Columns.Add(columnCeroUno);

            DataColumn columnDosA = new DataColumn();
            columnDosA.DataType = Type.GetType("System.String");
            columnDosA.ColumnName = "Tipo";
            Tabla.Columns.Add(columnDosA);

            DataColumn columnDos = new DataColumn();
            columnDos.DataType = Type.GetType("System.String");
            columnDos.ColumnName = "Descripcion";
            Tabla.Columns.Add(columnDos);

            DataColumn columnDosTres = new DataColumn();
            columnDosTres.DataType = Type.GetType("System.Int32");
            columnDosTres.ColumnName = "Capacidad";
            Tabla.Columns.Add(columnDosTres);

            DataColumn columnDosTresCuatro = new DataColumn();
            columnDosTresCuatro.DataType = Type.GetType("System.Int32");
            columnDosTresCuatro.ColumnName = "LitrosDisponibles";
            Tabla.Columns.Add(columnDosTresCuatro);

            DataColumn columnDosTresCinco = new DataColumn();
            columnDosTresCinco.DataType = Type.GetType("System.Int32");
            columnDosTresCinco.ColumnName = "Calidad";
            Tabla.Columns.Add(columnDosTresCinco);

            DataColumn columnUno = new DataColumn();
            columnUno.DataType = Type.GetType("System.DateTime");
            columnUno.ColumnName = "FechaCreacion";
            Tabla.Columns.Add(columnUno);

            DataColumn columnUnoFecha = new DataColumn();
            columnUnoFecha.DataType = Type.GetType("System.DateTime");
            columnUnoFecha.ColumnName = "FechaUltimaLimpieza";
            Tabla.Columns.Add(columnUnoFecha);

            DataColumn columnDosTresSeis = new DataColumn();
            columnDosTresSeis.DataType = Type.GetType("System.Int32");
            columnDosTresSeis.ColumnName = "Viscocidad";
            Tabla.Columns.Add(columnDosTresSeis);

            DataColumn columnDosOcho = new DataColumn();
            columnDosOcho.DataType = Type.GetType("System.String");
            columnDosOcho.ColumnName = "Localizacion";
            Tabla.Columns.Add(columnDosOcho);

            DataColumn columnDosNueve = new DataColumn();
            columnDosNueve.DataType = Type.GetType("System.String");
            columnDosNueve.ColumnName = "Combustible";
            Tabla.Columns.Add(columnDosNueve);

            ITanque it = new ImpITanque();

            foreach (Tanque tanque in it.ObtenerDatosTanques()){

                DataRow fila = Tabla.NewRow();

                fila["ID"] = tanque.idTanque;
                fila["Tipo"] = tanque.GetType().Name;
                fila["Descripcion"] = tanque.Descripcion;
                fila["Capacidad"] = tanque.Capacidad;
                fila["LitrosDisponibles"] = tanque.LitrosDisponibles;
                fila["Calidad"] = tanque.Calidad;
                fila["FechaCreacion"] = tanque.FechaCreacion;
                fila["FechaUltimaLimpieza"] = tanque.UltimaFechaLimpieza;

                if (tanque is TanqueAgua) {
                    fila["Viscocidad"] = 0;
                    fila["Localizacion"] = (tanque as TanqueAgua).localizacion;
                    fila["Combustible"] = "";
                }
                else if (tanque is TanqueCombustible)
                {
                    fila["Viscocidad"] = 0;
                    fila["Localizacion"] = "";
                    fila["Combustible"] = (tanque as TanqueCombustible).contenido.Nombre; 
                }
                else if (tanque is TanqueAceite)
                {
                    fila["Viscocidad"] = (tanque as TanqueAceite).viscosidad;
                    fila["Localizacion"] = "";
                    fila["Combustible"] = "";
                }
                Tabla.Rows.Add(fila);
            }
            
            return Tabla;
        }

    }
}
